/*
 * Copyright (c) 2016 ByteDance Inc. All rights reserved.
 */

package com.simin.base.easy.adapter;

import android.view.LayoutInflater;
import android.view.ViewGroup;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * 列表中的一个模板, 配合 {@link MultiTypeAdapter} 一起使用。
 *
 * @author wsm
 * @since 19/8/13
 */
public abstract class BaseTemplate<DATA, VH extends BaseViewHolder<DATA>> {

    /**
     * 当前模板的viewType
     */
    protected int sViewType = sAtomViewTypeCreator.incrementAndGet();

    /**
     * ViewType生成器，各子类可以通过 sAtomViewTypeCreator.incrementAndGet() 来生成当前模板的ViewType
     */
    protected static final AtomicInteger sAtomViewTypeCreator = new AtomicInteger(0);

    /**
     * 当前模板所属的Adapter
     */
    protected MultiTypeAdapter mOwnerAdapter;

    /**
     * 创建ViewHolder时调用
     *
     * @param layoutInflater Layout Inflater
     * @param parent         父View
     * @param viewType       View类型
     * @return ViewHolder
     */
    @NonNull
    public abstract VH onCreateViewHolder(@NonNull LayoutInflater layoutInflater, @NonNull ViewGroup parent, int viewType);

    /**
     * 和 ViewType 不一样，viewType 开发者无需关心
     *
     * 主要作用：处理同一种数据结构，对应多个 ViewHolder 和 BaseTemplate
     *
     * 通常情况下是一种数据结构对应一个 ViewHolder 和 BaseTemplate
     *
     * 获得当前模板的数据类型。<br/>
     * <p>
     * 注意这个返回值必须和 {@link DATA} 所表示的类型完全一致。<br/>
     * 如果 {@link DATA} 实现了 {@link IAdapterData} 接口, 那么这里返回值和 {@link IAdapterData#getDataType()} 保持一致,
     * 否则就直接返回<DATA>的class对象即可。
     *
     * @return 数据类型
     */
    @NonNull
    public abstract Object getDataType();

    /**
     * 当View被回收时调用
     *
     * @param holder ViewHolder对象
     */
    public void onViewRecycled(@NonNull VH holder) {
    }

    /**
     * 当模板所对应的 {@link VH} 处于屏幕中, 且这时候RecyclerView的滚动状态发生改变时调用, 可以在这状态中对 {@link VH} 做一些特殊的处理, 如, 暂停, 开始图片加载等。
     *
     * @param holder
     * @param newState
     */
    public void onScrollStateChanged(@NonNull VH holder, int newState) {
    }

    /**
     * 获得当前模板所属的RecyclerView
     *
     * @return RecyclerView对象
     */
    public final RecyclerView getRecyclerView() {
        return mOwnerAdapter.getOwnerRecyclerView();
    }

    /**
     * 获得当前模板所属的MultiTypeAdapter对象
     *
     * @return MultiTypeAdapter对象
     */
    public final MultiTypeAdapter getAdapter() {
        return mOwnerAdapter;
    }

    /**
     * 获得当前模板在的ViewType
     *
     * @return ViewType
     */
    public int getViewType() {
        return sViewType;
    }
}
